function cookie() {
    function get(k) {
        var r = document.cookie.match(new RegExp("(^| )"+k+"=([^;]*)(;|$)"));

        return r ? unescape(r[2]) : null;
    }

    /**
     * set
     *
     * @param k $k
     * @param v $v
     * @param o $o = { expires : '多少小时后过期', path : '路径', domain : '域名' }
     */
    function set(k, v, o) {
        var s = [ [k + '=' + escape(v)] ];

        for (var p in o) {
            var _k = p, _v = o[p];

            if (p == 'expires') {
                var d = new Date();
                d.setHours(d.getHours() + o[p]);
                _v = d.toGMTString();
            }

            s.push([_k + '=' + _v]);
        }

        document.cookie = s.join(';');
    }

    var p = Array.prototype.slice.call(arguments),
        a = p.length < 2 ? get : set;

    return a.apply(null, p);
}

/**
 * exportTo
 * 导出查询的数据
 */
function exportTo(url) {
    var jF = $('#formSearch'),
        param = jF.serialize();

    url += url.indexOf('?') == -1 ? '?' : '&';
    url += param;

    window.location.href = url;
}

/**
 * 刷新或跳转到指定网址 
 */
function reload(url) {
    if(typeof(url) == 'string') {
        window.location.href = url;
    } else {
        document.location.reload();
    }
}

/**
 * del clean status
 * 数据状态变更、清空数据确认、删除单条或多条数据确认 等情况
 * <a t="firm" m="操作确认信息" m2="针对选择多项操作时没有选定项目的提示信息" item="选择多项时关联的checkbox的g属性值" key="传递到后端的绑定多选值的键名">
 * m 定义确认提示,为空时不弹出确认框
 * m2 多项操作未选择数据时提示信息，有此项表示多项操作
 * key 默认为多选框去掉[]后的name值
 * item 关联的多选项checkbox的g属性值,默认为checkboxItem
 *
 * @return void
 */
function firm() {
    $(':[t=firm]').click(function(event) {
        event.preventDefault(); //阻止链接跳转

        var msg = $(this).attr('m') || '',
            msg2 = $(this).attr('m2') || '',
            item = $(this).attr('item') || 'checkboxItem',    //如果此项有值表示选择多条数据进行操作
            url = $(this).attr('href'),
            gotoUrl = $(this).attr('goto') || '',   //跳转地址，用于操作成功后跳转到此地址
            isReload = $(this).attr('reload') || '',  //是否重载当前页面,reload与goto属性只用一个即可，否则以reload为主
            action = 'get',
            dao = {};

        if(msg2) {
            var $item = $('[g=' + item + ']:checked');
            action = 'post';

            if($item.length < 1) {
                alert(msg2);

                return false;
            }

            var key = '',
                vals = [];

            /**
             * 获取被选中的值
             */
            $item.each(function(k, v) {
                $tmp = $(v);

                if(!key) {
                    key = ($tmp.attr('name')).replace(/\[\]/g, '');
                }

                vals.push($tmp.val());
            });

            dao[key] = vals;
        }

        if(msg) {
            if(!confirm(msg)) {
                return false;
            }
        }

        /*
         *var progress = $.messager.progress;
         *progress({text : '正在执行操作，请稍等...'});
         */

        $[action](url, dao, function(data) {
            if(!data.s) {
                alert(data.m);

                return false;
            }

            isReload ? reload() : reload(gotoUrl);
        }, 'json');
    });
}


/**
 * 复选框全选或取消选择
 *
 * id表示触发操作的checkbox元素id
 * tag表示被选择的checkbox的name属性
 */
function checkboxAction(id, name) {
    var o = $('#' + id);
    o.change(function(){
        var s = $(this).attr('checked');
        s = s == 'checked' ? true : false;
        $('[name="'+ name + '"]').attr('checked', s);
    });
}

/**
 * 返回表单中数据，结果为json格式
 */
function getFormValue(jForm){
    var tmp = jForm.serializeArray(),
        r = {};

    $.each(tmp, function(k, v){
        if(typeof(v.value) != 'undefined') {
            var index = v.name.indexOf('['); //名字中包含有[表示数组 

            if(index != -1) {
                var tmpName = v.name.substr(0, index);

                if(typeof(r[tmpName]) == 'undefined') {
                    r[tmpName] = [];
                }

                r[tmpName].push(v.value);
            } else {
                r[v.name] = v.value;
            }

        }
    });

    return r;
}

function fillToHtml(jDom, dao){
    jDom.find('span[name]').each(function(){
        var name = $(this).attr('name'),
            value = typeof(dao) == 'undefined' || typeof(dao[name]) == 'undefined'  ?   '&nbsp;'    :   dao[name];

        $(this).html(value);
    });
}

/**
 * 填充数据至表单和文本节点
 * input:checkbox的选中值用数组的形式表述
 */
function fill(jContainer, dao) {

    fillToHtml(jContainer, dao);

    $.each(dao, function(k, v){
        if(typeof(v) == 'function') {
            return ;
        }

        var name = typeof(v) == 'object' && v != null ? k + '\\[\\]' : k,
            jO = jContainer.find('[name='+ name + ']'),
            type = jO.length  ? jO[0].type : undefined,
            check = {checked : true};

        if(typeof(type) == 'undefined') {
            return;
        }

        switch(type) {
            case 'radio' :
                jO.filter('[value=' + v + ']').attr(check);
                break;

            case 'checkbox' :
                if(typeof(v) == 'object') {
                    $.each(v, function(k2, v2){
                        jO.filter('[value=' + v2 + ']').attr(check);
                    });
                } else {
                    jO.filter('[value=' + name + ']').attr(check);
                }
                break;

            default : 
                jO.val(v);
        }
    });
}

/**
*  加法
*/
function floatAdd(arg1,arg2) {
  var r1,r2,m;
  try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
  try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
  m=Math.pow(10,Math.max(r1,r2))
  return (arg1*m+arg2*m)/m
}
/**
*  减法
*/
function floatSub(arg1,arg2) {
  var r1,r2,m,n;
  try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
  try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
  m=Math.pow(10,Math.max(r1,r2));
  //动态控制精度长度
  n=(r1>=r2)?r1:r2;
  return ((arg1*m-arg2*m)/m).toFixed(n);
}
/**
*  乘法
*/
function floatMul(arg1,arg2) {
  var m=0,s1=arg1.toString(),s2=arg2.toString();
  try{m+=s1.split(".")[1].length}catch(e){}
  try{m+=s2.split(".")[1].length}catch(e){}
  return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
}
/**
*  除法
*/
function floatDiv(arg1,arg2) {
  var t1=0,t2=0,r1,r2;
  try{t1=arg1.toString().split(".")[1].length}catch(e){}
  try{t2=arg2.toString().split(".")[1].length}catch(e){}
  with(Math){
    r1=Number(arg1.toString().replace(".",""))
    r2=Number(arg2.toString().replace(".",""))
    return (r1/r2)*pow(10,t2-t1);
  }
}


/**
 * isMail
 * 验证email
 */
function isMail(mail) {
    return(new RegExp(/^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(mail));
}

/**
 * 验证固定电话和手机号
 */
function isTel(tel) { 
    var pattern=/(^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}1[0-9]{10}$)/; 

    return pattern.test(tel) ? true : false;
} 

/**
 * 验证qq号
 */
function isQq(qq) {
    return (new RegExp(/^[1-9]{1}[0-9]{4,12}$/).test(qq));
}

/**
 * 验证银行帐号
 */
function isBankAcc(acc) {
    return (new RegExp(/^[0-9\s]+$/).test(acc));
}

/**
 * 是否属于标准的用户名
 * 以字母开头，由字母、数字、横线、下划线组成
 */
function isUserName(s) {
    return (new RegExp(/^[a-z][0-9a-z\-_]{1,}/).test(s));
}



/**
 * 参数配置类 
 */
var Conf = {};

Conf.set = function(k, v) {
    if(typeof(k) == 'object') {
        for(var p in k) {
            Conf[p] = k[p];
        }
    } else {
        Conf[k] = v;
    }
}

Conf.get = function(k) {
    return Conf[k];
}



function copyToClipboard(txt) {
  if (window.clipboardData) {
      window.clipboardData.clearData();
      window.clipboardData.setData("Text", txt);

      alert("复制成功！")
  } else if (navigator.userAgent.indexOf("Opera") != -1) {
      window.location = txt;

      alert("复制成功！");
  } else if (window.netscape) {
      try {
          netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
      } catch (e) {
          alert("被浏览器拒绝！\n请在浏览器地址栏输入'about:config'并回车\n然后将 'signed.applets.codebase_principal_support'设置为'true'");
      }

      var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);

      if (!clip)
          return;

      var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);

      if (!trans)
          return;

      trans.addDataFlavor('text/unicode');

      var str = new Object();
      var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
      var copytext = txt;

      str.data = copytext;
      trans.setTransferData("text/unicode", str, copytext.length * 2);

      var clipid = Components.interfaces.nsIClipboard;

      if (!clip)
          return false;

      clip.setData(trans, null, clipid.kGlobalClipboard);

      alert("复制成功！")

  }
}
